﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;

namespace GieldaCSharp
{
    abstract class Wykres
    {
        protected List<kursV> lista = new List<kursV>(); // Lista z ktorej bedzie rysowany wykres

        protected Pen pioro; // Do rysowania wykresu
        protected Border b = new BorderAll();
        protected Data data = new Data();

        protected int iOd;
        protected int iDo;

        protected int PrzeskalujX(int x, int N)
        {
            return ((Convert.ToInt32((Convert.ToDouble(x) / Convert.ToDouble(N)) * Convert.ToDouble(b.maxXn - b.minXn)) + b.minXn));
        }

        protected int PrzeskalujY(double kurs, double maxY, double minY)
        {
            int zYn = b.maxYn - b.minYn;
            return (zYn - (Convert.ToInt32((Convert.ToDouble(kurs - minY) / Convert.ToDouble(maxY - minY)) * Convert.ToDouble(zYn)) - b.minYn));
        }

        protected void UstalStart(int OdK, int DoK)
        {
            bool start = false;
            bool stop = false;

            for (int i = 0; i < lista.Count; i++)
            {
                if ((lista[i].dataInt >= OdK) && (start == false))
                {
                    iOd = i;
                    start = true;
                }

                if ((lista[i].dataInt >= DoK))
                {
                    iDo = i;
                    stop = true;
                    break;
                }
            }
            if (false == start) { iDo = 0; }
            else
                if (false == stop) { iDo = lista.Count - 1; }            
        }

        public virtual double Max(int iOdC, int iDoC)
        {
            if (0 == lista.Count) return -9999999;
            if (0 == iDo) return -9999999;

            double max = 0;

            for (int i = iOd; i <= iDo; i++)
            {
                if (lista[i].x >= iOdC && lista[i].x <= iDoC)
                {
                    if (lista[i].kurs > max) max = lista[i].kurs;
                }        
            }           
            return max;
        }

        public virtual double Min(int iOdC, int iDoC)
        {
            if (0 == lista.Count) return 9999999;
            if (0 == iDo) return 9999999;

            double min = 9999999;// lista[iOd].kurs;

            for (int i = iOd ; i <= iDo; i++)
            {
                if (lista[i].x >= iOdC && lista[i].x <= iDoC)
                {
                    if (lista[i].kurs < min) min = lista[i].kurs;
                }
            }
            return min;
        }

        public abstract void Draw(PictureBox p, Graphics g, double maxY, double minY, int N);

    }
}
